local CommonOHOH = _G.CommonOHOH;
local M = CommonOHOH.class.new(script, CommonOHOH.files.CommonObject());
local ConnectClass=_G.CommonOHOH.load.Connect();

local BodyClass=require(script.Part.Body)
local FlagClass=require(script.Part.Flag)
local TailClass=require(script.Part.Tail)
local RingClass=require(script.Part.Ring)
local WeaponClass=require(script.Part.Weapon)

local CarEngineClass=require(script.CarEngine)


-- 初始化一辆车
function M.new(...)
	return M(...);
end;

function M.ctor(self,player,bodyId,flagId,ringId,tailId,weaponId)--构造函数
	M.super.ctor(self);

    self.BodyUpdateEvent=ConnectClass.new() --车身发生更新事件
    self.FlagUpdateEvent=ConnectClass.new() --装饰发生更新事件
    self.TailUpdateEvent=ConnectClass.new() --推进器发生更新事件
    self.RingUpdateEvent=ConnectClass.new() --轮胎发生更新事件
    self.WeaponUpdateEvent=ConnectClass.new() --钻头发生更新事件

    self.player=player
    self.Model = Instance.new("Model")
    if self.player then
        self.Model.Name = self.player:GetUserId()
    else 
        self.Model.Name = "defaultTestCar"
    end
    

    self.Engine=CarEngineClass.new(self)-- 初始化引擎
    self.Body=BodyClass.new(self)--车身
    self.Flag=FlagClass.new(self)--装饰
    self.Tail=TailClass.new(self)--轮胎
    self.Ring=RingClass.new(self)--推进器
    self.Weapon=WeaponClass.new(self)--钻头


    if bodyId then
        self:UpdateBody(bodyId)
    end

    if flagId then
        self:UpdateFlag(flagId)
    end

    if ringId then
        self:UpdateRing(ringId)
    end

    if tailId then
        self:UpdateTail(tailId)
    end

    if weaponId then
        self:UpdateWeapon(weaponId)
    end
    
end;


function M.dtor(self)
    self.Engine:dtor()
    self.Body:dtor()
    self.Flag:dtor()
    self.Ring:dtor()
    self.Weapon:dtor()
    self.Tail:dtor()
    self.Model:Destroy()

	M.super.dtor(self);
end;



-----------更新部件---------------
-- 更新车身
function M.UpdateBody(self,id)
    if self.bodyId and  self.bodyId==id then
        return 
    end
    self.bodyId=id
    self.Body:Update(self.bodyId)
    self.BodyUpdateEvent:Action(self.bodyId)

end

-- 更新推进器
function M.UpdateTail(self,id)
    if self.tailId and  self.tailId==id then
        return 
    end
    self.tailId=id
    self.Tail:Update(self.tailId)
    self.TailUpdateEvent:Action(self.tailId)
end


-- 更新钻头
function M.UpdateWeapon(self,id)
    if self.weaponId and  self.weaponId==id then
        return 
    end
    self.weaponId=id
    self.Weapon:Update(self.weaponId)
    self.WeaponUpdateEvent:Action(self.weaponId)
end

-- 更新轮胎
function M.UpdateRing(self,id)
    if self.ringId and  self.ringId==id then
        return 
    end
    self.ringId=id
    self.Ring:Update(self.ringId)
    self.RingUpdateEvent:Action(self.ringId)
end


-- 更新装饰
function M.UpdateFlag(self,id)
    if self.flagId and  self.flagId==id then
        return 
    end
    self.flagId=id
    self.Flag:Update(self.flagId)
    self.FlagUpdateEvent:Action(self.flagId)

end

function M.AddCharacter(self,characterModel)
    print("---------AddCharacter---------1------",characterModel)
    return   self:GetBody():AddCharacter(characterModel)
end
function M.AddCharacterToDrive(self,characterModel)
    print("---------AddCharacterToDrive---------1------",characterModel)
    return   self:GetBody():AddCharacterToDrive(characterModel)
end

--将HomeCar玩家移除座位
function M.RemoveCharacterToDrive(self,characterModel)
    print("---------RemoveCharacterToDrive---------1------",characterModel)
    return   self:GetBody():RemoveCharacterToDrive(characterModel)
end


--------------获取部件----------------------------
-- 获取装饰对象
function M.GetFlag(self)
    return  self.Tail
end

-- 获取车身对象
function M.GetBody(self)
    return  self.Body
end
-- 获取推进器对象
function M.GetTail(self)
    return  self.Tail
end
-- 获取钻头对象
function M.GetWeapon(self)
    return  self.Weapon
end
-- 获取轮胎对象
function M.GetRing(self)
    return  self.Ring
end
-- 获取引擎
function M.GetEngine(self)
    return  self.Engine
end


---------------------------对外公开--------------------------------------
--设置车的位置（需实现）
function M.SetCFrame(self,cf)
    self.Model:PivotTo(cf)
end

--设置车的父节点（需实现）
function M.SetParent(self,parent)
    self.Model.Parent = parent
end

--获取车的前进方向
function M.GetForwardUnit(self)
   return self.Engine:GetForwardUnit()
end
--设置车的前进速度（需实现）
function M.SetForwardSpeed(self,speed,carDirect)
    self.Engine:SetForwardSpeed(speed,carDirect)
    --做推机器表现
    self.Tail:SetForwardSpeed(speed)
end

-- 设置车的转速（需实现）
function M.SetDrillingSpeed(self,speed)
    self.Weapon:SetDrillingSpeed(speed)
end

-- 设置车的尾气状态  true为开 false为关
function M.SetEmitterStatus(self,status)
    self.Tail:SetEmitterStatus(status)
end

--获取模型
function M.GetModel(self)
    return self.Model
end

--获取车的位置
function M.GetCFrame(self)
   return  self.Model:GetPivot()
end
--锚固开关
function M.AnchoredSwitch(self,anchored)
   self.Engine:AnchoredSwitch(anchored)
end

--汽车爆炸
function M.CarCrash(self)
    local body  = self:GetBody().Instance
    local boundingCFrame, boundingSize =self.Model:GetBoundingBox()
    local boomRadius = boundingSize.magnitude
    local boomRadius = 5
    -- -- self.Engine:AnchoredSwitch(anchored)
    	--解除车身无法被爆炸摧毁的链接
		for _, descendant in ipairs( self.Model:GetDescendants()) do
			if descendant:IsA("Attachment") and descendant.Name == "Attachment1" then
				descendant:Destroy()
			end
            if descendant:IsA("Constraint") then
                descendant:Destroy() -- 销毁约束
            end

		end
	--避免爆炸后的零件对玩家车子产生阻碍
		for _, descendant in ipairs( self.Model:GetDescendants()) do
			if descendant:IsA("BasePart") and not descendant:IsA("Part") then--排除掉碰撞体
				descendant.CanCollide = true
			end
		end

		--爆炸
		local explosion = Instance.new("Explosion")
		explosion.BlastRadius = boomRadius--爆炸范围
		explosion.BlastPressure =1000 --爆炸力度
		explosion.ExplosionType = Enum.ExplosionType.Craters
		explosion.Position = body.Position -Vector3.new(0,body.Size.Y,0) -- CollidePart下方一点爆炸才能使 CollidePart腾空
		explosion.Parent = workspace
 end

return M